package day5.locks_demo;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * ReentrantLock的使用
 */
public class Demo1 {

    // 定义一个被操作的数
    static int r = 0;
    // 定义操作的数
    static final int COUNT = 1000_0000;

    static class Add extends Thread {

        Lock o;
        Add(Lock o) {
            this.o = o;
        }

        @Override
        public void run() {
            o.lock(); // 获取锁
            try {
                for (int i = 0; i < COUNT; i++) {
                    r++;
                }
            }finally {
                o.unlock(); // 释放锁
            }
        }
    }

    static class Sub extends Thread {

        Lock o;
        Sub(Lock o) {
            this.o = o;
        }

        @Override
        public void run() {
            o.lock(); // 加锁
            try {
                for (int i = 0; i < COUNT; i++) {
                    r--;
                }
            } finally {
                o.unlock(); // 解锁
            }
        }
    }

    public static void main(String[] args) throws InterruptedException {

        Lock o = new ReentrantLock();

        Thread add = new Add(o);
        add.start();
        Thread sub = new Sub(o);
        sub.start();

        // 等待结束
        add.join();
        sub.join();

        // 加锁后线程安全
        System.out.println(r);
        // 加锁使得两个线程互斥执行
    }
}
